﻿using HCMS.CommonDtos;
using HCMS.Entities.Manage;
using HCMS.Repositories.Manage;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace HCMS.IServices.Manage
{
    /// <summary>
    /// 角色 菜单 应用服务 接口
    /// </summary>
    public interface IRoleMenuAppService : ICommonAppService<ManageDbContext, RoleMenu>
    {
        /// <summary>
        /// 设置角色 菜单权限
        /// </summary>
        /// <param name="roleId">角色 Id</param>
        /// <param name="menuId">菜单 Id 列表</param>
        /// <param name="updateUser">更新 人</param>
        /// <returns></returns>
        Task<bool> SetRoleMenu(int roleId, List<int> menuId, string updateUser);

        /// <summary>
        /// 根据角色 Id 获取已选中菜单 Ids
        /// </summary>
        /// <param name="roleId">角色 Id</param>
        /// <returns></returns>
        Task<List<int>> GetSelectMenuIdByRoleId(int roleId);

        /// <summary>
        /// 根据角色 Id 获取菜单列表
        /// </summary>
        /// <param name="roleId">角色 Id</param>
        /// <param name="isRefreshCache">是否刷新缓存</param>
        /// <returns></returns>
        Task<List<Menu>> MenuListByRoleId(int roleId, bool isRefreshCache = false);

        /// <summary>
        /// 根据 角色 Id 获取管理系统菜单
        /// </summary>
        /// <param name="roleId">角色 Id</param>
        /// <param name="isRefreshCache">是否刷新缓存</param>
        /// <returns></returns>
        Task<List<ManageMenuTreeDto>> GetManageMenuByRoleId(int roleId, bool isRefreshCache = false);

        /// <summary>
        /// 根据 角色 Id 刷新缓存
        /// </summary>
        /// <param name="roleId">角色 Id</param>
        /// <returns></returns>
        Task<bool> RefreshCacheByRoleId(int roleId);

        /// <summary>
        /// 查找角色指定权限
        /// </summary>
        /// <param name="roleId">角色 Id</param>
        /// <param name="findControllerName">权限所在的控制器名称</param>
        /// <param name="actionNames">需要生成的方法名称</param>
        /// <returns></returns>
        Task<List<Menu>> FindMenuByRole(int roleId, string findControllerName, string[] actionNames);
    }
}
